//hashtable类的构造函数
//hash计算散列值，一般把数组的长度设置为质数，因为把他设置成质数之后，。他那个hash值是按他的ascii值对长度取余
//算的，所以一班都把他设置成质数，这叫除留余数法，但是有时候会出现碰撞，所以又有了另外一种hash值法
function HashTable() {
    this.table=new Array(137);//创建一个数组存放值
    this.simpleHash=simpleHash;//先给他生成hash值
    this.showDistro=showDistro;
    this.put=put;
    this.betterHash=betterHash;
    this.get=get;
    this.value=[];
}
//把ascii值相加，然后再初一数组长度的余数，
function simpleHash(data){
    var total=0;
    for(var i=0;i<data.length;i++){
        total+=data.charCodeAt(i);
    }
    return total%this.table.length;
}
//把data经过hashsimple之后当做数组的位置，data存入对应的位置
// function put(data){
//     var pos=this.simpleHash(data);
//     this.table[pos]=data;
// }
//显示
function showDistro(){
    var n=0,arr=[];
    for(var i=0;i<this.table.length;i++){
        if(this.table[i]!==undefined){
            arr+=i+" :"+this.table[i]+"\n";
        }
    }
    console.log(arr);
    return arr;
}
//一个更好的hashtable，为了解决碰撞问题,
//新的散列函数，先计算字符串的ascii值，在求和时每次呈上一个质数，测试出来乘以37；，这样刚好不会碰撞
function betterHash(string,arr){
    const H=37;
    var total=0;
    for(var i=0;i<string.length;i++){
        total+=H*total+string.charCodeAt(i);
    }
    total=total%arr.length;
    return parseInt(total);
}

//put函数需要改变,改了pos获取时调用哪种方法
function put(){
    var pos=this.betterHash(data);
    this.table[pos]=data;
}

//对散列表排序，从散列表中取值，以键值对存储
function put(key,data){
    var pos=this.betterHash(key);
    this.table[pos]=data;
}

//get 方法在这个时候用到
function get(key){
    return this.table[this.betterHash(key)];
}

